"""
循环的else子句
学习目标：
1. 理解循环else子句的概念
2. 掌握for...else的使用
3. 掌握while...else的使用
4. 区分正常结束和break退出
"""

# ==================== 1. for...else基础 ====================
print("=" * 50)
print("1. for...else 基础")
print("=" * 50)

print("语法结构：")
print("""
for 变量 in 序列:
    循环体
else:
    循环正常结束后执行的代码
""")

print("\n示例1：正常结束（执行else）")
for i in range(3):
    print(f"  循环：{i}")
else:
    print("  ✅ 循环正常结束，执行else")

print("\n示例2：break退出（不执行else）")
for i in range(5):
    print(f"  循环：{i}")
    if i == 2:
        print("  遇到break")
        break
else:
    print("  这句不会执行（因为break了）")

print("\n💡 关键点：")
print("  - 循环正常结束：执行else")
print("  - break退出：不执行else")
print("  - else是可选的")

print()

# ==================== 2. while...else基础 ====================
print("=" * 50)
print("2. while...else 基础")
print("=" * 50)

print("示例1：正常结束")
count = 1
while count <= 3:
    print(f"  计数：{count}")
    count += 1
else:
    print("  ✅ 循环正常结束")

print("\n示例2：break退出")
count = 1
while count <= 10:
    print(f"  计数：{count}")
    if count == 3:
        print("  遇到break")
        break
    count += 1
else:
    print("  这句不会执行")

print()

# ==================== 3. 实战：查找元素 ====================
print("=" * 50)
print("3. 实战：在列表中查找元素")
print("=" * 50)

# 使用else的优雅写法
fruits = ["apple", "banana", "orange"]
target = "grape"

print(f"水果列表：{fruits}")
print(f"查找：{target}")

for fruit in fruits:
    if fruit == target:
        print(f"✅ 找到了：{fruit}")
        break
else:
    print(f"❌ 没找到：{target}")

print()

# 对比：不使用else的写法
print("对比：传统写法（使用标志变量）")
found = False
for fruit in fruits:
    if fruit == target:
        print(f"✅ 找到了：{fruit}")
        found = True
        break

if not found:
    print(f"❌ 没找到：{target}")

print("\n💡 使用else更简洁，无需标志变量")

print()

# ==================== 4. 实战：质数判断 ====================
print("=" * 50)
print("4. 实战：判断是否为质数")
print("=" * 50)

def is_prime(n):
    """使用for...else判断质数"""
    if n < 2:
        return False
    
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            print(f"  {n}能被{i}整除")
            return False  # 找到因子，不是质数
    else:
        # 循环正常结束，没找到因子，是质数
        return True

number = 17
print(f"判断{number}是否为质数：")
if is_prime(number):
    print(f"✅ {number}是质数")
else:
    print(f"❌ {number}不是质数")

print()

number = 15
print(f"判断{number}是否为质数：")
if is_prime(number):
    print(f"✅ {number}是质数")
else:
    print(f"❌ {number}不是质数")

print()

# ==================== 5. 实战：验证密码 ====================
print("=" * 50)
print("5. 实战：密码验证（限定次数）")
print("=" * 50)

correct_password = "python123"
max_attempts = 3

# 模拟输入
passwords = ["111", "222", "333"]

print(f"请输入密码（最多{max_attempts}次）：")

for attempt in range(1, max_attempts + 1):
    password = passwords[attempt - 1]
    print(f"\n第{attempt}次尝试：{'*' * len(password)}")
    
    if password == correct_password:
        print("✅ 密码正确！登录成功")
        break
else:
    # 循环正常结束（没有break），说明次数用完了
    print("\n❌ 尝试次数已用完，账户已锁定")

print()

# ==================== 6. 实战：检查列表所有元素 ====================
print("=" * 50)
print("6. 实战：检查是否所有成绩都及格")
print("=" * 50)

scores = [85, 92, 78, 88, 95]
print(f"成绩列表：{scores}")

for score in scores:
    if score < 60:
        print(f"❌ 有不及格成绩：{score}")
        break
else:
    print("✅ 所有成绩都及格")

print()

# 另一个例子
scores2 = [85, 55, 78, 88, 95]
print(f"成绩列表：{scores2}")

for score in scores2:
    if score < 60:
        print(f"❌ 有不及格成绩：{score}")
        break
else:
    print("✅ 所有成绩都及格")

print()

# ==================== 7. 实战：查找第一个偶数 ====================
print("=" * 50)
print("7. 实战：查找第一个偶数")
print("=" * 50)

numbers = [1, 3, 5, 7, 9]
print(f"列表：{numbers}")

for num in numbers:
    if num % 2 == 0:
        print(f"✅ 找到第一个偶数：{num}")
        break
else:
    print("❌ 列表中没有偶数")

print()

# ==================== 8. 实战：用户输入验证 ====================
print("=" * 50)
print("8. 实战：用户输入验证（while...else）")
print("=" * 50)

max_attempts = 3
attempt = 0

# 模拟输入
inputs = ["abc", "xyz", "150"]

print("请输入一个1-100的数字：")

while attempt < max_attempts:
    user_input = inputs[attempt]
    attempt += 1
    
    print(f"\n第{attempt}次输入：{user_input}")
    
    if user_input.isdigit():
        number = int(user_input)
        if 1 <= number <= 100:
            print(f"✅ 输入有效：{number}")
            break
        else:
            print("❌ 数字必须在1-100之间")
    else:
        print("❌ 请输入数字")
else:
    print("\n❌ 输入次数已用完")

print()

# ==================== 9. 实战：检查字符串 ====================
print("=" * 50)
print("9. 实战：检查字符串是否包含数字")
print("=" * 50)

text = "Hello Python"
print(f"文本：{text}")

for char in text:
    if char.isdigit():
        print(f"✅ 包含数字：{char}")
        break
else:
    print("❌ 不包含数字")

print()

text2 = "Python 3.11"
print(f"文本：{text2}")

for char in text2:
    if char.isdigit():
        print(f"✅ 包含数字：{char}")
        break
else:
    print("❌ 不包含数字")

print()

# ==================== 10. 实战：范围查找 ====================
print("=" * 50)
print("10. 实战：查找范围内的第一个平方数")
print("=" * 50)

start = 50
end = 100

print(f"查找{start}-{end}之间的第一个完全平方数：")

for i in range(start, end + 1):
    sqrt = int(i ** 0.5)
    if sqrt * sqrt == i:
        print(f"✅ 找到了：{i} = {sqrt}²")
        break
else:
    print(f"❌ {start}-{end}之间没有完全平方数")

print()

# ==================== 11. continue不影响else ====================
print("=" * 50)
print("11. continue不影响else执行")
print("=" * 50)

print("示例：打印奇数，跳过偶数")
for i in range(1, 6):
    if i % 2 == 0:
        continue  # continue不影响else
    print(f"  {i}")
else:
    print("  ✅ 循环正常结束（continue不影响）")

print("\n💡 关键点：")
print("  - 只有break会阻止else执行")
print("  - continue不会影响else")
print("  - return也会阻止else执行")

print()

# ==================== 12. 实战：批量验证 ====================
print("=" * 50)
print("12. 实战：批量验证数据")
print("=" * 50)

usernames = ["alice", "bob_123", "charlie", "admin", "user"]
forbidden = ["admin", "root", "system"]

print(f"用户名列表：{usernames}")
print(f"禁用列表：{forbidden}")
print("\n验证结果：")

for username in usernames:
    if username in forbidden:
        print(f"❌ {username} 是禁用用户名")
        break
else:
    print("✅ 所有用户名都可用")

print()

# ==================== 13. 嵌套循环的else ====================
print("=" * 50)
print("13. 嵌套循环中的else")
print("=" * 50)

print("示例：在二维列表中查找")
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
target = 5

print("矩阵：")
for row in matrix:
    print(f"  {row}")

print(f"\n查找：{target}")

found = False
for i, row in enumerate(matrix):
    for j, element in enumerate(row):
        if element == target:
            print(f"✅ 找到了！位置：[{i}][{j}]")
            found = True
            break
    if found:
        break
else:
    print(f"❌ 未找到：{target}")

print()

# ==================== 14. 实战：游戏循环 ====================
print("=" * 50)
print("14. 实战：简单游戏循环")
print("=" * 50)

max_rounds = 5
# 模拟玩家状态
player_alive = [True, True, True, False, True]

print(f"游戏开始（最多{max_rounds}回合）：")

for round_num in range(1, max_rounds + 1):
    print(f"\n第{round_num}回合")
    
    if not player_alive[round_num - 1]:
        print("  玩家失败！游戏结束")
        break
    
    print("  继续游戏...")
else:
    print("\n🎉 完成所有回合！游戏胜利！")

print()

# ==================== 15. 对比总结 ====================
print("=" * 50)
print("15. 使用else vs 不使用else对比")
print("=" * 50)

print("场景：查找列表中的目标")
target = "python"
items = ["java", "c++", "ruby"]

print("\n方法1：使用else（推荐）")
for item in items:
    if item == target:
        print(f"找到：{item}")
        break
else:
    print(f"未找到：{target}")

print("\n方法2：使用标志变量")
found = False
for item in items:
    if item == target:
        print(f"找到：{item}")
        found = True
        break
if not found:
    print(f"未找到：{target}")

print("\n💡 else的优势：")
print("  - 代码更简洁")
print("  - 无需额外变量")
print("  - 意图更清晰")

print()

# ==================== 总结 ====================
print("=" * 50)
print("✨ 循环else子句总结")
print("=" * 50)
print("""
1. 语法结构：
   for/while 循环:
       循环体
   else:
       循环正常结束时执行

2. 执行规则：
   ✅ 循环正常结束 → 执行else
   ✅ break退出 → 不执行else
   ✅ continue → 不影响else
   ✅ return → 不执行else

3. 典型应用：
   - 查找元素（找到break，找不到else）
   - 验证数据（失败break，成功else）
   - 检查条件（不满足break，满足else）
   - 尝试操作（失败break，成功else）

4. 常见模式：

   # 模式1：查找
   for item in items:
       if item == target:
           print("找到了")
           break
   else:
       print("没找到")

   # 模式2：验证
   for data in dataset:
       if not validate(data):
           print("验证失败")
           break
   else:
       print("全部验证通过")

   # 模式3：尝试
   for attempt in range(max_attempts):
       if try_something():
           print("成功")
           break
   else:
       print("所有尝试都失败")

5. 优点：
   ✅ 代码更简洁
   ✅ 无需标志变量
   ✅ 逻辑更清晰
   ✅ Pythonic风格

6. 注意事项：
   ⚠️ 只有break会阻止else执行
   ⚠️ continue不影响else
   ⚠️ 空循环也会执行else
   ⚠️ 嵌套循环，else属于最近的循环

7. 何时使用：
   - 需要区分"找到"和"未找到"
   - 需要区分"成功"和"失败"
   - 所有尝试后的默认行为
   - 替代笨重的标志变量
""")
print("=" * 50)

